package com.ssj.utils;

import java.util.ArrayList;
import java.util.List;


public class SQLUtils {


    /**
     * 将SQL字符串中的命名参数替换为"?"占位符。
     *
     * @param sql 包含命名参数的SQL查询字符串，格式为#{paramName}。
     * @param selectParams 要替换的参数名称列表。
     * @return 将命名参数替换为"?"占位符后的SQL查询字符串。
     */
    public static String replaceParam(String sql, List<Object> selectParams) {
        // 遍历参数名称列表
        for (int i = 0; i < selectParams.size(); i++) {
            // 获取当前的参数名称
            Object paramName = selectParams.get(i);
            // 将SQL字符串中出现的命名参数替换为"?"
            sql = sql.replace("#{" + paramName + "}", "?");
        }
        // 返回修改后的SQL字符串
        return sql;
    }

    /**
     * 将SQL字符串中的命名参数替换为"?"占位符。
     *
     * @param sql 包含命名参数的SQL查询字符串，格式为#{paramName}。
     * @param parameterName 要替换的参数名称数组。
     * @return 将命名参数替换为"?"占位符后的SQL查询字符串。
     */
    public static String replaceParam(String sql, String[] parameterName) {
        // 遍历参数名称数组
        for (int i = 0; i < parameterName.length; i++) {
            // 获取当前的参数名称并去除前后的空白字符
            String string = parameterName[i].trim();
            // 将SQL字符串中出现的命名参数替换为"?"
            sql = sql.replace("#{" + string + "}", "?");
        }
        // 返回修改后的SQL字符串
        return sql;
    }

    /**
     * 从SQL查询字符串的WHERE子句中提取参数名称列表。
     *
     * @param sql 包含WHERE子句和命名参数的SQL查询字符串。
     * @return 从WHERE子句中提取的参数名称列表。
     */
    public static List<Object> getSelectParams(String sql) {
        List<Object> paramList = new ArrayList<>();

        // 查找WHERE子句的起始索引
        int whereIndex = sql.toLowerCase().indexOf("where");
        if (whereIndex == -1) {
            // 如果没有WHERE子句，返回空列表
            return paramList;
        }

        // 从SQL字符串中提取WHERE子句
        String whereClause = sql.substring(whereIndex + 5).trim();
        if (whereClause.isEmpty()) {
            // 如果WHERE子句为空，返回空列表
            return paramList;
        }

        // 按"and"分割WHERE子句，得到各个条件
        String[] paramsStrs = whereClause.split("\\s+and\\s+");
        // 遍历每个条件
        for (String paramsStr : paramsStrs) {
            // 按"="分割条件，提取参数
            if (paramsStr.contains("=")) {
                String[] parts = paramsStr.split("=");
                if (parts.length == 2) {
                    String param = parts[1].replace("#{", "").replace("}", "").trim();
                    if (!param.isEmpty()) {
                        // 将参数名称添加到列表中
                        paramList.add(param);
                    }
                }
            }
        }
        // 返回参数名称列表
        return paramList;
    }

    /**
     * 从INSERT SQL查询字符串的VALUES子句中提取参数名称列表。
     *
     * @param sql 包含INSERT语句和命名参数的SQL查询字符串。
     * @return 从VALUES子句中提取的参数名称数组。
     */
    public static String[] getInsertParams(String sql) {
        // 查找VALUES子句的起始索引
        int startIndex = sql.indexOf("values");
        // 从SQL字符串中提取VALUES子句，去除参数名称中的#{和}，并去除括号
        String values = sql.substring(startIndex + 6).replaceAll("#\\{", "").replaceAll("}", "").
                replace("(", "").replace(")", "");
        // 按逗号分割清理后的VALUES子句，得到各个参数名称
        return values.split(",");
    }

    public static List<Object> getUpdateParams(String sql) {
        List<Object> paramList = new ArrayList<>();

        // 查找SET子句的起始索引
        int setStartIndex = sql.toLowerCase().indexOf("set") + 3;
        int whereStartIndex = sql.toLowerCase().indexOf("where");

        // 如果没有WHERE子句
        if (whereStartIndex == -1) {
            // 提取整个SET子句
            String setClause = sql.substring(setStartIndex).trim();
            addSetParams(paramList, setClause);
        } else {
            // 提取SET子句中的参数
            String setClause = sql.substring(setStartIndex, whereStartIndex).trim();
            addSetParams(paramList, setClause);

            // 提取WHERE子句中的参数
            String whereClause = sql.substring(whereStartIndex + 5).trim();
            addWhereParams(paramList, whereClause);
        }

        return paramList;

    }
    // 辅助方法：提取SET子句中的参数
    private static void addSetParams(List<Object> paramList, String setClause) {
        String[] setParams = setClause.split(",");
        for (String setParam : setParams) {
            String param = setParam.split("=")[1].replace("#{", "").replace("}", "").trim();
            paramList.add(param);
        }
    }
    // 辅助方法：提取WHERE子句中的参数
    private static void addWhereParams(List<Object> paramList, String whereClause) {
        String[] whereParams = whereClause.split("\\s+and\\s+");
        for (String whereParam : whereParams) {
            if (whereParam.contains("=")) {
                String[] parts = whereParam.split("=");
                if (parts.length == 2) {
                    String param = parts[1].replace("#{", "").replace("}", "").trim();
                    if (!param.isEmpty()) {
                        paramList.add(param);
                    }
                }
            }
        }
    }
}
